import * as readLine from 'readline';
import { Lexer } from '../lexer/lexer';
import { TokenConst } from '../token/token';

export class REPL {
  private rl;
  private prompt: string;

  constructor(prompt: string = '>> ') {
    this.prompt = prompt;
    this.rl = readLine.createInterface({
      input: process.stdin,
      output: process.stdout,
      terminal: true
    });
  }

  public start() {
    console.log('Monkey语言解释器 - 按Enter键提交输入，输入.exit退出');
    this.rl.setPrompt(this.prompt);
    this.rl.prompt();

    // 监听行输入事件
    this.rl.on('line', (line) => {
      // 检查是否退出
      if (line.trim() === '.exit') {
        console.log('再见!');
        this.rl.close();
        return;
      }

      // 处理输入内容
      this.processInput(line);

      // 重新显示提示符
      this.rl.prompt();
    });

    // 监听关闭事件
    this.rl.on('close', () => {
      process.exit(0);
    });

    // 监听按键事件（用于检测回车键）
    if (process.stdin.isTTY) {
      process.stdin.setRawMode(true);
      process.stdin.on('keypress', (chunk, key) => {
        // 检测回车键
        if (key && key.name === 'return') {
          // 这里可以添加回车键特定逻辑
          // 注意：在line事件中已经处理了回车键提交的输入
        }

        // 允许使用Ctrl+C退出
        if (key && key.ctrl && key.name === 'c') {
          console.log('\n再见!');
          process.exit(0);
        }
      });
    }
  }

  private processInput(input: string) {
    console.log(`你输入的内容: ${input}`);
    let lexer = new Lexer(input);
    // let token = lexer.nextToken();
    // while(token.type !== TokenConst.EOF ){
    for(let tok = lexer.nextToken(); tok.type !== TokenConst.EOF ; tok = lexer.nextToken()){
      console.log(tok);
      // token = lexer.nextToken();
    }
    // 检查是否只按了回车键
  }
}

let repl = new REPL();
repl.start();
